import 'dart:io';
import 'package:logging/logging.dart';
import 'package:logging_appenders/logging_appenders.dart';
import 'package:path/path.dart' as path;

/// 日志工具类
/// 
/// 功能特性：
/// - 日志按大小回滚（2MB）
/// - 日志文件按创建时间命名（年月日时分秒）
/// - 日志最多保留14天
/// - 支持多种日志级别
class LogUtil {
  static RotatingFileAppender? _fileAppender;
  LogUtil._xx();
  LogUtil._();
  // LogUtil.xx();//外面可以通过  var log = LogUtil.xx();来获取实例
  // LogUtil.xx(){}//等同于LogUtil.xx();
  /// 初始化日志系统
  /// 
  /// [logDir] 日志文件存储目录，默认为应用文档目录下的logs文件夹
  /// [logLevel] 日志级别，默认为INFO
  /// [enableConsole] 是否同时输出到控制台，默认为true
  static Future<void> init({
    String? logDir,
    Level logLevel = Level.INFO,
    bool enableConsole = true,
  }) async {
    // 设置全局日志级别
    Logger.root.level = logLevel;
    
    // 获取日志目录
    final String logDirectory = logDir ?? await _getDefaultLogDirectory();
    
    // 确保日志目录存在
    final Directory dir = Directory(logDirectory);
    if (!await dir.exists()) {
      await dir.create(recursive: true);
    }
    
    // 清理过期日志文件
    await _cleanupOldLogs(logDirectory);
    
    // 生成日志文件名（基于当前时间）
    final String timestamp = _generateTimestamp();
    final String logFileName = 'app_$timestamp.log';
    final String logFilePath = path.join(logDirectory, logFileName);
    
    // 创建文件日志追加器
    _fileAppender = RotatingFileAppender(
      baseFilePath: logFilePath,
      rotateAtSizeBytes: 2 * 1024 * 1024, // 2MB
      keepRotateCount: 10, // 保留10个回滚文件
    );
    
    // 添加文件日志处理器到 root logger
    Logger.root.onRecord.listen(_fileAppender!.handle);
    
    // 如果启用控制台输出，添加控制台处理器
    if (enableConsole) {
      Logger.root.onRecord.listen((record) {
        print('${record.time} [${record.level.name}] ${record.loggerName}: ${record.message}');
        if (record.error != null) {
          print('Error: ${record.error}');
        }
        if (record.stackTrace != null) {
          print('StackTrace: ${record.stackTrace}');
        }
      });
    }
    
    Logger.root.info('日志系统初始化完成，日志文件：$logFilePath');
  }
  
  /// 生成时间戳字符串（年-月-日_时_分_秒）
  static String _generateTimestamp() {
    final DateTime now = DateTime.now();
    return '${now.year}-${now.month.toString().padLeft(2, '0')}-${now.day.toString().padLeft(2, '0')}'
           '_${now.hour.toString().padLeft(2, '0')}_${now.minute.toString().padLeft(2, '0')}_${now.second.toString().padLeft(2, '0')}';
  }
  
  /// 获取默认日志目录
  static Future<String> _getDefaultLogDirectory() async {
    // 在Flutter中，通常使用应用文档目录
    // 这里提供一个通用的实现，实际使用时可能需要根据平台调整
    final String currentDir = Directory.current.path;
    return path.join(currentDir, 'logs');
  }
  
  /// 清理过期日志文件（保留14天）
  static Future<void> _cleanupOldLogs(String logDirectory) async {
    try {
      final Directory dir = Directory(logDirectory);
      if (!await dir.exists()) return;
      
      final DateTime cutoffDate = DateTime.now().subtract(const Duration(days: 14));
      
      await for (final FileSystemEntity entity in dir.list()) {
        if (entity is File && entity.path.endsWith('.log')) {
          final FileStat stat = await entity.stat();
          if (stat.modified.isBefore(cutoffDate)) {
            await entity.delete();
            print('删除过期日志文件: ${path.basename(entity.path)}');
          }
        }
      }
    } catch (e) {
      print('清理日志文件时出错: $e');
    }
  }
  
  // ==================== 静态方法 ====================
  
  /// 记录调试信息
  static void d(String message, [Object? error, StackTrace? stackTrace]) {
    Logger.root.fine(message, error, stackTrace);
  }
  
  /// 记录一般信息
  static void i(String message, [Object? error, StackTrace? stackTrace]) {
    Logger.root.info(message, error, stackTrace);
  }
  
  /// 记录警告信息
  static void w(String message, [Object? error, StackTrace? stackTrace]) {
    Logger.root.warning(message, error, stackTrace);
  }
  
  /// 记录错误信息
  static void e(String message, [Object? error, StackTrace? stackTrace]) {
    Logger.root.severe(message, error, stackTrace);
  }
  
  /// 记录详细信息
  static void v(String message, [Object? error, StackTrace? stackTrace]) {
    Logger.root.finest(message, error, stackTrace);
  }
  
  /// 关闭日志系统
  static Future<void> dispose() async {
    await _fileAppender?.dispose();
    _fileAppender = null;
  }
}